package com.zpself.module.算法练习.String;

/**
 * @author By ZengPeng
 * @Description 给定一个由若干 0 和 1 组成的数组 A，我们最多可以将 K 个值从 0 变成 1 。 返回仅包含 1 的最长（连续）子数组的长度。
 *
 * 示例 1：
 * 输入：A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
 * 输出：6
 * 解释：
 * [1,1,1,0,0,1,1,1,1,1,1]
 * 粗体数字从 0 翻转到 1，最长的子数组长度为 6。
 *
 * 示例 2：
 * 输入：A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
 * 输出：10
 * 解释：
 * [0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
 * 粗体数字从 0 翻转到 1，最长的子数组长度为 10。
 *
 * @date in  2021/2/19 15:08
 * @Modified By
 */
public class 力扣_1004_最大连续1的个数_3 {

    public static void main(String[] args) {
        System.out.println(longestOnes(new int[]{0,0,0,1},3));
        System.out.println(longestOnes(new int[]{1,1,1,0,0,0,1,1,1,1,0},2));
        System.out.println(longestOnes(new int[]{0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1},3));
    }
    //题解：双指针滑动窗口+ 维护k的值
    public static int longestOnes(int[] A, int K) {
        int len = A.length;//最大长度
        int max = 0;//最大长度
        int rPoint=0;//右边指针
        //0,1,2,3,4,5,6,7,8,9,10
        //1,1,1,0,0,0,1,1,1,1,0         K=2  ,len =11
        //        i           r
        for (int i = 0; i < len; i++) {
            if(i!=0 && A[i-1]==0){
                rPoint++;
                K++;//排除了一个0  给k++
            }
            while ( rPoint<len && K>=0){
                if(A[rPoint]==0)K--;
                if(K<0)break;
                rPoint++;
            }
            max = max>(rPoint-i)? max : (rPoint-i);
        }
        return max;
    }
}
